1 module unde.games.dizzy.omega.squid;
2 
3 import derelict.opengl3.gl;
4 import std.conv;
5 import std.math;
6 import std.format;
7 import unde.games.object;
8 import unde.games.renderer;
9 import unde.global_state;
10 
11 class Squid:StaticGameObject
12 {
13     static int num;
14     int number;
15     
16     int hidden;
17 
18     enum SPEED = 0.1;
19     enum MAX_V = 0.02;
20     enum A = 0.00075;
21 
22     float def_x, def_y, def_z;
23     float dx = 0.0, dy = 0.0;
24     float by, sy;
25     ulong delay;
26     
27     this(MainGameObject root, float[3] coords, float by,
28         float sy = float.nan, float dx = 0.0, ulong delay = 0)
29     {
30         def_x = x = coords[0];
31         def_y = y = coords[1];
32         def_z = z = coords[2];
33 
34         this.by = by;
35         number = num++;
36         dy = 0.0;
37         this.dx = dx;
38         this.delay = delay;
39         this.sy = sy;
40         if (!sy.isNaN) y = sy;
41         
42         super(root);
43     }
44 
45     override void draw(GlobalState gs)
46     {
47         if (!hidden && abs(x-root.scrx) < 32 &&
48             abs(y-root.scry) < 18)
49         {
50             uint frame = 0;
51             float dy = by - def_y;
52             if (y - def_y < dy/11)
53                 frame = 0;
54             if (y - def_y < dy/11*2)
55                 frame = 1;
56             if (y - def_y < dy/11*3)
57                 frame = 2;
58             if (y - def_y < dy/11*4)
59                 frame = 3;
60             if (y - def_y < dy/11*5)
61                 frame = 4;
62             if (y - def_y < dy/11*6)
63                 frame = 5;
64             if (y - def_y < dy/11*7)
65                 frame = 6;
66             if (y - def_y < dy/11*8)
67                 frame = 7;
68             if (y - def_y < dy/11*9)
69                 frame = 8;
70             if (y - def_y < dy/11*10)
71                 frame = 9;
72             if (y - def_y < dy)
73                 frame = 10;
74 
75             glDisable(GL_DEPTH_TEST);
76             glDisable(GL_CULL_FACE);
77             glPushMatrix();
78             glTranslatef(x, y, z);
79             recursive_render(gs, root.models["squid-"~frame.to!(string)], null, null, false, true);
80             glPopMatrix();
81             glEnable(GL_DEPTH_TEST);
82             glEnable(GL_CULL_FACE);
83         } 
84     }
85 
86     void hide()
87     {
88         hidden = true;
89     }
90 
91     override bool tick(GlobalState gs)
92     {
93         if ( hidden || abs(root.scrx-x) > 16.0 &&
94              abs(root.scrx-def_x) > 16.0 ||
95              abs(root.scry-y) > 18.0 )
96             return true;
97 
98         frame++;
99         if (frame < delay) return true;
100 
101         x += dx;
102         y += dy;
103 
104         dy -= A;
105         if (sy.isNaN && dy < -MAX_V) dy = -MAX_V;
106         
107         if (y < by)
108             dy = SPEED;
109         return true;
110     }
111 
112     override void load(string[string] s)
113     {
114         string p = "squid"~number.to!(string);
115         if (p~"-x" in s)
116             x = s[p~"-x"].to!(float);
117         else
118             x = def_x;
119             
120         if (p~"-y" in s)
121             y = s[p~"-y"].to!(float);
122         else
123         {
124             y = def_y;
125             if (!sy.isNaN) y = sy;
126         }
127             
128         if (p~"-z" in s)
129             z = s[p~"-z"].to!(float);
130         else
131             z = def_z;
132 
133         /*if (p~"-dx" in s)
134             dx = s[p~"-dx"].to!(float);
135         else
136             dx = 0.0;*/
137 
138         if (p~"-dy" in s)
139             dy = s[p~"-dy"].to!(float);
140         else
141             dy = 0.0;
142 
143         frame = 0;
144 
145         if (p in s)
146         {
147             hidden = (s[p] == "hidden")?1:0;
148         }
149         else
150         {
151             hidden = 0;
152         }
153     }
154 
155     override void save(ref string[string] s)
156     {
157         string p = "squid"~number.to!(string);
158         if (hidden == 1)
159             s[p] = "hidden";
160 
161         s[p~"-x"] = x.to!(string);
162         s[p~"-y"] = y.to!(string);
163         s[p~"-z"] = z.to!(string);
164         //s[p~"-dx"] = dx.to!(string);
165         s[p~"-dy"] = dy.to!(string);
166         s[p~"-state"] = state.to!(string);
167     }    
168 }